package br.com.locadoracom.dao;

import java.util.Date;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;

import br.com.locadoracom.model.Filme;
import br.com.locadoracom.model.ItemFilme;
import br.com.locadoracom.model.Pais;
import br.com.locadoracom.model.ParticipanteFilme;

public class FilmeDao extends Dao<Filme> {

	EntityManagerFactory  emf = Persistence.createEntityManagerFactory("Locadora");
	EntityManager em = emf.createEntityManager();
	
	@Override
	public void create(Filme filme) {
		em.getTransaction().begin();
		em.persist(filme);
		em.getTransaction().commit();
	}

	@Override
	public Filme merge(Filme filme) {
		Filme temp;
		em.getTransaction().begin();
		temp = em.merge(filme);
		em.getTransaction().commit();
		return temp;
	}

	@Override
	public void remove(Filme filme) {
		em.getTransaction().begin();
		em.remove(filme);
		em.getTransaction().commit();
	}

	@Override
	public Filme findById(Integer Id) {
		return em.find(Filme.class, Id);
	}

	@SuppressWarnings("unchecked")
	public List<Filme> findByAll() throws Exception {
		String strQuery="select f from Filme f";
        Query rsQuery = em.createQuery(strQuery);
		return  rsQuery.getResultList();
	}
	
	public Filme procurarPorTituloOriginal(String titulo){ 
		Query query = em.createQuery("select f from Filme f where f.tituloOriginal=:titulo");
		query.setParameter("titulo", titulo);
		if (query.getResultList().size() == 0)
			return null;
		return (Filme) query.getSingleResult();
	}
	
	public Filme procurarPorTituloPortugues(String titulo){ 
		Query query = em.createQuery("select f from Filme f where f.tituloPortugues=:titulo");
		query.setParameter("titulo", titulo);
		if (query.getResultList().size() == 0)
			return null;
		return (Filme) query.getSingleResult();
	}
	
	public Pais procurarPaisPorNome(String nome){
		Query query = em.createQuery("select p from Pais p where p.nome=:nome");
		query.setParameter("nome", nome);
		if (query.getResultList().size() == 0)
			return null;
		return (Pais) query.getSingleResult();
	}

	public ParticipanteFilme procurarParticipantePorNomeNascimento(String nome, Date nascimento){
		Query query = em.createQuery("select p from ParticipanteFilme p where p.nome=:nome and p.nascimento=:nascimento");
		query.setParameter("nome", nome);
		query.setParameter("nascimento", nascimento);
		if (query.getResultList().size() == 0)
			return null;
		return (ParticipanteFilme) query.getSingleResult();
	}
	
	public ItemFilme procuraItemPorId(Integer Id) {
		return em.find(ItemFilme.class, Id);
	}

}
